#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>  // 包含体素网格化的头文件
#include <pcl/visualization/pcl_visualizer.h>
 
int main(int argc, char** argv)
{
    // 1. 创建PointCloud对象，用于存储原始点云数据
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
 
    // 2. 读取点云数据
    if (pcl::io::loadPCDFile("/root/PCL/Chinadragon.pcd", *cloud) == -1)  // 加载点云文件
    {
        PCL_ERROR("Couldn't read file input.pcd \n");
        return -1;
    }
 
    // 3. 创建PointCloud对象，用于存储体素网格化后的点云数据
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
 
    // 4. 创建体素网格过滤器对象
    pcl::VoxelGrid<pcl::PointXYZ> voxel_grid;
    voxel_grid.setInputCloud(cloud);  // 设置输入点云
    voxel_grid.setLeafSize(0.01f, 0.01f, 0.01f);  // 设置体素网格的大小
    voxel_grid.filter(*cloud_filtered);  // 进行体素网格化处理，并将结果存储到cloud_filtered中
 
    // 5. 创建PCLVisualizer对象，用于显示点云数据
    pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
    viewer->setBackgroundColor(0, 0, 0);  // 设置背景颜色为黑色
    viewer->addPointCloud<pcl::PointXYZ>(cloud_filtered, "voxel grid cloud");  // 添加体素网格化后的点云
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "voxel grid cloud");  // 设置点的大小
 
    // 6. 启动可视化主循环
    while (!viewer->wasStopped())
    {
        viewer->spinOnce(100);  // 让可视化窗口刷新
    }
 
    return 0;
}